import hashlib
import os
import tarfile
import zipfile

import pandas as pd
import requests

DATA_HUB = dict()
DATA_URL = 'http://d2l-data.s3-accelerate.amazonaws.com/'


def download(name, cache_dir=os.path.join('..', 'data')):
    '''下载一个DATA_HUB中的文件，返回本地文件名'''
    # assert后面是不满足条件时显示的字符串，如果想执行操作就try except
    assert name in DATA_HUB, f"{name} 不存在于 {DATA_HUB}."
    # 根据传入的name获取url和密钥
    url, sha1_hash = DATA_HUB[name]
    os.makedirs(cache_dir, exist_ok=True)
    # 将url按 '/' 切五花肉 获取五花肉块列表 返回最后一块肉
    fname = os.path.join(cache_dir, url.split('/')[-1])

    if os.path.exists(fname):
        # 创建一个sha1加密的对象
        sha1 = hashlib.sha1()
        with open(fname, 'rb') as f:
            while True:
                data = f.read(1048576)  # 2的20次方bytes（字节） 即1MB
                if not data:
                    break  # 不用再判断密钥了直接给我去下载吧
                sha1.update(data)
        # 如果生成的密钥和之前DATA_HUB中保存的秘钥一样那么就直接返回其文件名，不用下载
        if sha1.hexdigest() == sha1_hash:
            print('Nep！文件已存在！')
            return fname

    # 那就只有下载了噻
    print(f'Nep！正在从{url}中下载{fname}...')
    r = requests.get(url, stream=True, verify=True)
    with open(fname, 'wb') as f:
        f.write(r.content)
    return fname


def download_extract(name, folder=None):
    '''下载并解压zip/tar文件'''
    fname = download(name)
    base_dir = os.path.dirname(fname)  # 去掉文件名，返回目录base_dir
    data_dir, ext = os.path.splitext(fname)  # 获取文件名和后缀名
    if ext == '.zip':
        fp = zipfile.ZipFile(fname, 'r')
    elif ext in ('.tar', '.gz'):
        fp = tarfile.open(fname, 'r')
    else:
        assert False, 'Nep! 只可以解压zip/tar哦！'
    fp.extractall(base_dir)  # 解压到当前目录base_dir
    return os.path.join(base_dir, folder) if folder else data_dir


def download_all():
    '''下载DATA_HUB中的所有文件'''
    for name in DATA_HUB:
        download(name)


# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':
    print('----------')
    # 1-定义要下载的文件
    DATA_HUB['kaggle_house_train'] = (
        # 二元组分别对应其url和密钥
        DATA_URL + 'kaggle_house_pred_train.csv',
        '585e9cc93e70b39160e7921475f9bcd7d31219ce')

    DATA_HUB['kaggle_house_test'] = (
        DATA_URL + 'kaggle_house_pred_test.csv',
        'fa19780a7b011d9b009e8bff8e99922a8ee2eb90')

    # 2-进行文件下载
    train_data = pd.read_csv(download('kaggle_house_train'))
    test_data = pd.read_csv(download('kaggle_house_test'))
